<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/5/19 0019
 * Time: 上午 9:21
 */

namespace App\Http\Classes\IM;


class IM
{
    public $urls = [
        'user' => [
            'create'                => 'https://api.netease.im/nimserver/user/create.action',
            'update'                => 'https://api.netease.im/nimserver/user/update.action',
            'updateUinfo'           => 'https://api.netease.im/nimserver/user/updateUinfo.action',
            'refreshToken'          => 'https://api.netease.im/nimserver/user/refreshToken.action',
            'block'                 => 'https://api.netease.im/nimserver/user/block.action',
            'unblock'               => 'https://api.netease.im/nimserver/user/unblock.action',
            'setSpecialRelation'    => 'https://api.netease.im/nimserver/user/setSpecialRelation.action',
            'listBlackAndMuteList'  => 'https://api.netease.im/nimserver/user/listBlackAndMuteList.action',
            'getUinfos'             => 'https://api.netease.im/nimserver/user/getUinfos.action',
            'setDonnop'             => 'https://api.netease.im/nimserver/user/setDonnop.action',
        ],
        'friend' => [
            'add'                   => 'https://api.netease.im/nimserver/friend/add.action',
            'update'                => 'https://api.netease.im/nimserver/friend/update.action',
            'delete'                => 'https://api.netease.im/nimserver/friend/delete.action',
            'get'                   => 'https://api.netease.im/nimserver/friend/get.action'
        ],
        'msg' => [
            'sendMsg'               => 'https://api.netease.im/nimserver/msg/sendMsg.action',
            'sendAttachMsg'         => 'https://api.netease.im/nimserver/msg/sendAttachMsg.action',
            'sendBatchMsg'          => 'https://api.netease.im/nimserver/msg/sendBatchMsg.action',
            'upload'                => 'https://api.netease.im/nimserver/msg/upload.action',
            'fileUpload'            => 'https://api.netease.im/nimserver/msg/fileUpload.action',
            'recall'                => 'https://api.netease.im/nimserver/msg/recall.action'
        ],
        'team'  => [
            'create'                => 'https://api.netease.im/nimserver/team/create.action',
            'add'                   => 'https://api.netease.im/nimserver/team/add.action',
            'kick'                  => 'https://api.netease.im/nimserver/team/kick.action',
            'remove'                => 'https://api.netease.im/nimserver/team/remove.action',
            'update'                => 'https://api.netease.im/nimserver/team/update.action',
            'query'                 => 'https://api.netease.im/nimserver/team/query.action',
            'changeOwner'           => 'https://api.netease.im/nimserver/team/changeOwner.action',
            'addManager'            => 'https://api.netease.im/nimserver/team/addManager.action',
            'removeManager'         => 'https://api.netease.im/nimserver/team/removeManager.action',
            'joinTeams'             => 'https://api.netease.im/nimserver/team/joinTeams.action',
            'updateTeamNick'        => 'https://api.netease.im/nimserver/team/updateTeamNick.action',
            'muteTeam'              => 'https://api.netease.im/nimserver/team/muteTeam.action',
            'muteTlist'             => 'https://api.netease.im/nimserver/team/muteTlist.action',
            'leave'                 => 'https://api.netease.im/nimserver/team/leave.action',
            'muteTlistAll'          => 'https://api.netease.im/nimserver/team/muteTlistAll.action',
            'listTeamMute'          => 'https://api.netease.im/nimserver/team/listTeamMute.action'
        ],
        'history' => [
            'querySessionMsg'       => 'https://api.netease.im/nimserver/history/querySessionMsg.action',
            'queryTeamMsg'          => 'https://api.netease.im/nimserver/history/queryTeamMsg.action',
            'queryUserEvents'       => 'https://api.netease.im/nimserver/history/queryUserEvents.action',
            'deleteMediaFile'       => 'https://api.netease.im/nimserver/history/deleteMediaFile.action'
        ],
        'subscribe' => [
            'add'                   => 'https://api.netease.im/nimserver/event/subscribe/add.action',
            'delete'                => 'https://api.netease.im/nimserver/event/subscribe/delete.action',
            'batchdel'              => 'https://api.netease.im/nimserver/event/subscribe/batchdel.action',
            'query'                 => 'https://api.netease.im/nimserver/event/subscribe/query.action'
        ]
    ];

    //protected $data;

    public function __construct()
    {

    }
    /*创建云信ID
     * 参数	类型	必须	说明
        accid	String	是	网易云通信ID，最大长度32字符，必须保证一个
                            APP内唯一（只允许字母、数字、半角下划线_、
                            @、半角点以及半角-组成，不区分大小写，
                            会统一小写处理，请注意以此接口返回结果中的accid为准）。
        name	String	否	网易云通信ID昵称，最大长度64字符，用来PUSH推送
                            时显示的昵称
        props	String	否	json属性，第三方可选填，最大长度1024字符
        icon	String	否	网易云通信ID头像URL，第三方可选填，最大长度1024
        token	String	否	网易云通信ID可以指定登录token值，最大长度128字符，
                            并更新，如果未指定，会自动生成token，并在
                            创建成功后返回
     */
    public function register($data){
        if(isset($data['accid'])){
            $dataArray = array();
            $dataArray['accid'] = $data['accid'];
            if(isset($data['name'])){
                $dataArray['name'] = $data['name'];
            }

            if(isset($data['props'])){
                $dataArray['props'] = $data['props'];
            }

            if(isset($data['icon'])){
                $dataArray['icon'] = $data['icon'];
            }

            if(isset($data['token'])){
                $dataArray['token'] = $data['token'];
            }

            $url = $this->urls['user']['create'];

            $curl = new IMCurl($url,$dataArray);

            return $curl->getResponse();
        }
        else{
            return false;
        }
    }

    /*
     * 网易云通信ID更新
        参数	类型	必须	说明
        accid	String	是	网易云通信ID，最大长度32字符，必须保证一个
                            APP内唯一
        props	String	否	json属性，第三方可选填，最大长度1024字符
        token	String	否	网易云通信ID可以指定登录token值，最大长度128字符
     */
    public function update($data){
        if(isset($data['accid'])){
            $dataArray = array();
            $dataArray['accid'] = $data['accid'];
            if(isset($data['props'])){
                $dataArray['props'] = $data['props'];
            }

            if(isset($data['token'])){
                $dataArray['token'] = $data['token'];
            }

            $url = $this->urls['user']['update'];

            $curl = new IMCurl($url,$dataArray);

            return $curl->getResponse();
        }
        else{
            return false;
        }
    }

    /*
     *更新并获取新token
     * 1.webserver更新网易云通信ID的token，同时返回新的token；

        2.一般用于网易云通信ID修改密码，找回密码或者第三方有需求获取新的token。
    参数	类型	必须	说明
accid	String	是	网易云通信ID，最大长度32字符，必须保证一个
APP内唯一
     */
    public function refreshToken(array $data = null){
        if($data === null){
            return null;
        }
        else{
            if(isset($data['accid'])){
                $url = $this->urls['user']['refreshToken'];

                $curl = new IMCurl($url,$data);

                return $curl->getResponse();
            }
            else{
                return false;
            }
        }
    }

    /*
     * 发送普通消息
     * 给用户或者高级群发送普通消息，包括文本，图片，语音，视频和地理位置，具体消息参考下面描述
     * 参数	类型	必须	说明
        from	String	是	发送者accid，用户帐号，最大32字符，
                            必须保证一个APP内唯一
         ope	int	    是	0：点对点个人消息，1：群消息（高级群），其他返回414
          to	String	是	ope==0是表示accid即用户id，ope==1表示tid即群id
        type	int	    是	0 表示文本消息,
                            1 表示图片，
                            2 表示语音，
                            3 表示视频，
                            4 表示地理位置信息，
                            6 表示文件，
                            100 自定义消息类型
        body    String	是	请参考下方消息示例说明中对应消息的body字段，
                            最大长度5000字符，为一个JSON串 body={"msg":"hello"}
    antispam	String	否	本消息是否需要过自定义反垃圾系统，true或false, 默认false
 antispamCustom	String	否	自定义的反垃圾内容, JSON格式，长度限制同body字段，不能超过5000字符，                                   antispamCustom示例：

                            {"type":1,"data":"custom content"}

                            字段说明：
                            1. type: 1:文本，2：图片，3视频;
                            2. data: 文本内容or图片地址or视频地址。
        option	String	否	发消息时特殊指定的行为选项,JSON格式，可用于指定消息的漫游，存云端历史，发送                            方多端同步，推送，消息抄送等特殊行为;option中字段不填时表示默认值                                    ，option示例:

                            {"push":false,"roam":true,"history":false,"sendersync":true,                                            "route":false,"badge":false,"needPushNick":true}

                            字段说明：
                            1. roam: 该消息是否需要漫游，默认true（需要app开通漫游消息功能）； 
                            2. history: 该消息是否存云端历史，默认true；
                             3. sendersync: 该消息是否需要发送方多端同步，默认true；
                             4. push: 该消息是否需要APNS推送或安卓系统通知栏推送，默认true；
                             5. route: 该消息是否需要抄送第三方；默认true (需要app开通消息抄送功能);
                             6. badge:该消息是否需要计入到未读计数中，默认true;
                            7. needPushNick: 推送文案是否需要带上昵称，不设置该参数时默认true;
                            8. persistent: 是否需要存离线消息，不设置该参数时默认true。
    pushcontent	String	否	ios推送内容，不超过150字符，option选项中允许推送（push=true），此字段可以                             指定推送内容
        payload	String	否	ios 推送对应的payload,必须是JSON,不能超过2k字符
            ext	String	否	开发者扩展字段，长度限制1024字符
forcepushlist	String	否	发送群消息时的强推（@操作）用户列表，格式为JSONArray，如["accid1",
                            "accid2"]。若forcepushall为true，则forcepushlist为除发送者外的所有有效群                             成员
forcepushcontent String	否	发送群消息时，针对强推（@操作）列表forcepushlist中的用户，强制推送的内容
  forcepushall	String	否	发送群消息时，强推（@操作）列表是否为群里除发送者外的所有有效成员，true或                             false，默认为false
     */
    public function sendMsg(array $data = null){
        if($data === null){
            return null;
        }
        else{
            if(isset($data['from'])
                && isset($data['ope'])
                && isset($data['to'])
                && isset($data['type'])
                && isset($data['body'])){
                $dataArray = array();
                $dataArray['from'] = (string)$data['from'];
                $dataArray['ope'] = (int)$data['ope'];
                $dataArray['to'] = (string)$data['to'];
                $dataArray['type'] = (int)$data['type'];
                $dataArray['body'] = json_encode($data['body']);

                if(isset($data['antispam'])){
                    $dataArray['antispam'] = $data['antispam'];
                }

                if(isset($data['antispamCustom'])){
                    $dataArray['antispamCustom'] = json_encode($data['antispamCustom']);
                }

                if(isset($data['pushcontent'])){
                    $dataArray['pushcontent'] = (string)$data['pushcontent'];
                }

                if(isset($data['payload'])){
                    $dataArray['payload'] = json_encode($data['payload']);
                }

                if(isset($data['ext'])){
                    $dataArray['ext'] = (string)$data['ext'];
                }

                if(isset($data['forcepushlist'])){
                    $dataArray['forcepushlist'] = json_encode($data['forcepushlist']);
                }

                if(isset($data['forcepushall'])){
                    $dataArray['forcepushall'] = $data['forcepushall'];
                }

                $url = $this->urls['msg']['sendMsg'];

                $curl = new IMCurl($url,$dataArray);

                return $curl->getResponse();
            }
            else{
                return false;
            }
        }
    }

    /*
     * 批量发送点对点普通消息
     *  1.给用户发送点对点普通消息，包括文本，图片，语音，视频，地理位置和自定义消息。
        2.最大限500人，只能针对个人,如果批量提供的帐号中有未注册的帐号，会提示并返回给用户。
        3.此接口受频率控制，一个应用一分钟最多调用120次，超过会返回416状态码，并且被屏蔽一段时间；
          具体消息参考下面描述。

    参数	类型	必须	说明
            fromAccid	String	是	发送者accid，用户帐号，最大32字符，
                                    必须保证一个APP内唯一
            toAccids	String	是	["aaa","bbb"]（JSONArray对应的accid，如果解析出错，会报414错误）                                     ，限500人
                type	int	    是	0 表示文本消息,
                                    1 表示图片，
                                    2 表示语音，
                                    3 表示视频，
                                    4 表示地理位置信息，
                                    6 表示文件，
                                    100 自定义消息类型
                body	String	是	请参考下方消息示例说明中对应消息的body字段，
                                    最大长度5000字符，为一个json串
                option	String	否	发消息时特殊指定的行为选项,Json格式，可用于指定消息的漫游，存云端                                     历史，发送方多端同步，推送，消息抄送等特殊行为;option中字段不填时                                     表示默认值 option示例:

                                    {"push":false,"roam":true,"history":false,"sendersync":true,"route":false,"badge":false,"needPushNick":true}

                                    字段说明：
                                    1. roam: 该消息是否需要漫游，默认true（需要app开通漫游消息功能）； 
                                    2. history: 该消息是否存云端历史，默认true；
                                     3. sendersync: 该消息是否需要发送方多端同步，默认true；
                                     4. push: 该消息是否需要APNS推送或安卓系统通知栏推送，默认true；
                                     5. route: 该消息是否需要抄送第三方；默认true (需要app开通消息抄送功能);
                                     6. badge:该消息是否需要计入到未读计数中，默认true;
                                    7. needPushNick: 推送文案是否需要带上昵称，不设置该参数时默认true;
            pushcontent	String	否	ios推送内容，不超过150字符，option选项中允许推送（push=true），此                                     字段可以指定推送内容
                payload	String	否	ios 推送对应的payload,必须是JSON,不能超过2k字符
                    ext	String	否	开发者扩展字段，长度限制1024字符
     */
    public function sendBatchMsg($data){

    }

    /*
     * 消息格式示例:
1.文本消息

复制{
    "from":"test1",
    "ope":0,
    "to":"test2",
    "type":0,//文本消息类型
    "body":{
        "msg":"哈哈哈"//消息内容
    }
}
2 图片消息

复制{
    "from":"test1",
    "ope":0,
    "to":"test2",
    "type":1    //图片类型消息
    "body":{
        "name":"图片发送于2015-05-07 13:59",   //图片name
        "md5":"9894907e4ad9de4678091277509361f7",    //md5
        "url":"http://nimtest.nos.netease.com/cbc500e8-e19c-4b0f-834b-c32d4dc1075e",    //生成的url
                "ext":"jpg",    //图片后缀
        "w":6814,    //宽
        "h":2332,    //高
        "size":388245    //图片大小
    }
}
3 语音消息

复制{
    "from":"test1",
    "ope":0,
    "to":"test2",
    "type":2    //语音类型消息
    "body":{
        "dur":4551,        //语音持续时长ms
        "md5":"87b94a090dec5c58f242b7132a530a01",    //md5
        "url":"http://nimtest.nos.netease.com/a2583322-413d-4653-9a70-9cabdfc7f5f9",    //生成的url
        "ext":"aac",        //语音消息格式，只能是aac格式
        "size":16420        //语音文件大小
    }
}
4 视频消息

复制{
    "from":"test1",
    "ope":0,
    "to":"test2",
    "type":3    //视频类型消息
    "body":{
        "dur":8003,        //视频持续时长ms
        "md5":"da2cef3e5663ee9c3547ef5d127f7e3e",    //md5
        "url":"http://nimtest.nos.netease.com/21f34447-e9ac-4871-91ad-d9f03af20412",    //生成的url
        "w":360,    //宽
        "h":480,    //高
        "ext":"mp4",    //视频格式
        "size":16420    //视频文件大小
    }
}
5 发送地理位置消息

复制{
    "from":"test1",
    "ope":0,
    "to":"test2",
    "type":4    //地理位置类型消息
    "body":{
        "title":"中国 浙江省 杭州市 网商路 599号",    //地理位置title
        "lng":120.1908686708565,        // 经度
        "lat":30.18704515647036            // 纬度
    }
}
6 发送文件消息

复制{
    "from":"test1",
    "ope":0,
    "to":"test2",
    "type":6    //文件消息
    "body":{
        "name":"BlizzardReg.ttf",    //文件名
        "md5":"79d62a35fa3d34c367b20c66afc2a500", //文件MD5
        "url":"http://nimtest.nos.netease.com/08c9859d-183f-4daa-9904-d6cacb51c95b", //文件URL
        "ext":"ttf",    //文件后缀类型
        "size":91680    //大小
    }
}
7 发送第三方自定义消息

复制{
    "from":"test1",
    "ope":0,
    "to":"test2",
    "type":100    //第三方自定义消息
    //第三方定义的body体，json串
    "body":{
        "myKey":myValue
    }
}
     */

    /*
     * 发送自定义系统通知
     * 1.自定义系统通知区别于普通消息，方便开发者进行业务逻辑的通知；
        2.目前支持两种类型：点对点类型和群类型（仅限高级群），根据msgType有所区别。
        应用场景：如某个用户给另一个用户发送好友请求信息等，具体attach为请求消息体，第三方可以自行扩展，建议是json格式
        参数	类型	必须	说明
        from	String	是	发送者accid，用户帐号，最大32字符，APP内唯一
        msgtype	int	    是	0：点对点自定义通知，1：群消息自定义通知，其他返回414
            to	String	是	msgtype==0是表示accid即用户id，msgtype==1表示tid即群id
        attach	String	是	自定义通知内容，第三方组装的字符串，建议是JSON串，最大长度4096字符
    pushcontent	String	否	iOS推送内容，第三方自己组装的推送内容,不超过150字符
        payload	String	否	iOS推送对应的payload,必须是JSON,不能超过2k字符
        sound	String	否	如果有指定推送，此属性指定为客户端本地的声音文件名，长度不要超过30个字符，如果不指定，会使用默认声音
         save   int	    否	1表示只发在线，2表示会存离线，其他会报414错误。默认会存离线
        option	String	否	发消息时特殊指定的行为选项,Json格式，可用于指定消息计数等特殊行为;option中字段不填时表示默认值。
                            option示例：
                            {"badge":false,"needPushNick":false,"route":false}
                            字段说明：
                            1. badge:该消息是否需要计入到未读计数中，默认true;
                            2. needPushNick: 推送文案是否需要带上昵称，不设置该参数时默认false(ps:注意与sendMsg.action接口有别);
                            3. route: 该消息是否需要抄送第三方；默认true (需要app开通消息抄送功能)
     */
    public function sendAttachMsg($data){

    }

    /*
     * 批量发送点对点自定义系统通知
     * 1.系统通知区别于普通消息，应用接收到直接交给上层处理，客户端可不做展示；
       2.目前支持类型：点对点类型；
       3.最大限500人，只能针对个人,如果批量提供的帐号中有未注册的帐号，会提示并返回给用户；
       4.此接口受频率控制，一个应用一分钟最多调用120次，超过会返回416状态码，并且被屏蔽一段时间；
        应用场景：如某个用户给另一个用户发送好友请求信息等，具体attach为请求消息体，第三方可以自行扩展，建议是json格式

参数	类型	必须	说明
        fromAccid	String	是	发送者accid，用户帐号，最大32字符，APP内唯一
        toAccids	String	是	["aaa","bbb"]（JSONArray对应的accid，如果解析出错，会报414错误），最大限500人
          attach	String	是	自定义通知内容，第三方组装的字符串，建议是JSON串，最大长度4096字符
      pushcontent	String	否	iOS推送内容，第三方自己组装的推送内容,不超过150字符
         payload	String	否	iOS推送对应的payload,必须是JSON,不能超过2k字符
            sound	String	否	如果有指定推送，此属性指定为客户端本地的声音文件名，长度不要超过30个字符，如果不指定，会使用默认声音
            save	int	    否	1表示只发在线，2表示会存离线，其他会报414错误。默认会存离线
            option	String	否	发消息时特殊指定的行为选项,Json格式，可用于指定消息计数等特殊行为;option中字段不填时表示默认值。
                                option示例：
                                {"badge":false,"needPushNick":false,"route":false}
                                字段说明：
                                1. badge:该消息是否需要计入到未读计数中，默认true;
                                2. needPushNick: 推送文案是否需要带上昵称，不设置该参数时默认false(ps:注意与sendBatchMsg.action接口有别)。
                                3. route: 该消息是否需要抄送第三方；默认true (需要app开通消息抄送功能)
     */
    public function sendBatchAttachMsg($data){

    }

    /*
     * 消息撤回
     * 消息撤回接口，可以撤回一定时间内的点对点与群消息
     *
            参数	类型	必须	说明
        deleteMsgid	String	是	要撤回消息的msgid
            timetag	long	是	要撤回消息的创建时间
            type	int	    是	7:表示点对点消息撤回，8:表示群消息撤回，其它为参数错误
            from	String	是	发消息的accid
              to	String	是	如果点对点消息，为接收消息的accid,如果群消息，为对应群的tid
             msg	String	否	可以带上对应的描述
        ignoreTime	String	否	1表示忽略撤回时间检测，其它为非法参数，如果需要撤回时间检测，不填即可
     */
    public function recall($data){

    }

    /*
     * 文件上传
     * 文件上传，字符流需要base64编码，最大15M。
     * 参数	类型	必须	说明
        content	String	是	字符流base64串(Base64.encode(bytes)) ，最大15M的字符流
        type	String	否	上传文件类型
     */
    public function upload($data){

    }

    /*
     * 文件上传（multipart方式）
     * 参数	类型	必须	说明
content	Multipart	是	最大15M的字符流
type	String	    否	上传文件类型

     */
    public function fileUpload($data){

    }

    /*
     * 参数	     类型	必须	                说明
     * accid	String	是	用户帐号，最大长度32字符，必须保证一个APP内唯一
        name	String	否	用户昵称，最大长度64字符
        icon	String	否	用户icon，最大长度1024字符
        sign	String	否	用户签名，最大长度256字符
        email	String	否	用户email，最大长度64字符
        birth	String	否	用户生日，最大长度16字符
        mobile	String	否	用户mobile，最大长度32字符，只支持国内号码
        gender	int	    否	用户性别，0表示未知，1表示男，2女表示女，其它会报参数错误
            ex	String	否	用户名片扩展字段，最大长度1024字符，用户可自行扩展，建议封装成JSON字符串
     */
    public function updateUinfo(array $data = null){
        if($data === null){
            return null;
        }
        else{
            if(isset($data['accid'])){
                $dataArray = array();
                $dataArray['accid'] = (string)$data['accid'];
                if(isset($data['name'])){
                    $dataArray['name'] = (string)$data['name'];
                }

                if(isset($data['icon'])){
                    $dataArray['icon'] = (string)$data['icon'];
                }

                if(isset($data['sign'])){
                    $dataArray['sign'] = (string)$data['sign'];
                }

                if(isset($data['email'])){
                    $dataArray['email'] = (string)$data['email'];
                }

                if(isset($data['birth'])){
                    $dataArray['birth'] = (string)$data['birth'];
                }

                if(isset($data['mobile'])){
                    $dataArray['mobile'] = (string)$data['mobile'];
                }

                if(isset($data['gender'])){
                    $dataArray['gender'] = (int)$data['gender'];
                }

                if(isset($data['ex'])){
                    $dataArray['ex'] = (string)$data['ex'];
                }

                $url = $this->urls['user']['updateUinfo'];

                $curl = new IMCurl($url,$dataArray);

                return $curl->getResponse();
            }
            else{
                return false;
            }
        }
    }

    /*封禁云信ID
     * 参数	类型	必须	说明
        accid	String	是	网易云通信ID，最大长度32字符，必须保证一个
                            APP内唯一
       needkick	String	否	是否踢掉被禁用户，true或false，默认false
     */
    public function block(array $data = null){
        if($data === null){
            return null;
        }
        else{
            if(isset($data['accid'])){
                $dataArray = array();
                $dataArray['accid'] = (string)$data['accid'];

                if(isset($data['needkick'])){
                    $dataArray['needkick'] = $data['needkick'];
                }

                $url = $this->urls['user']['block'];

                $curl = new IMCurl($url,$dataArray);

                return $curl->getResponse();
            }
            else{
                return false;
            }
        }
    }

    /*
     *
        参数	类型	必须	说明
        accid	String	是	网易云通信ID，最大长度32字符，必须保证一个
                            APP内唯一
     *
     */
    public function unblock(array $data = null){
        if($data === null){
            return null;
        }
        else{
            if(isset($data['accid'])){
                $data['accid'] = (string)$data['accid'];

                $url = $this->urls['user']['unblock'];

                $curl = new IMCurl($url,$data);

                return $curl->getResponse();
            }
            else{
                return false;
            }
        }
    }

    /*
     *
        参数	类型	必须	说明
        accids	String	是	用户帐号（例如：JSONArray对应的accid串，如：["zhangsan"]，如果解析出错，                               会报414）（一次查询最多为200）
     */
    public function getUinfos(array $data = null){
        if($data === null){
            return null;
        }
        else{
            if(isset($data['accids'])){
                $dataArray = array();

                $dataArray['accids'] = json_encode($data['accids']);

                $url = $this->urls['user']['getUinfos'];

                $curl = new IMCurl($url,$dataArray);

                return $curl->getResponse();
            }
        }
    }

    /*
     * 用户设置
     * 设置桌面端在线时，移动端是否需要推送
     *
        参数	类型	必须	说明
        accid	String	是	用户帐号
     donnopOpen	String	是	桌面端在线时，移动端是否不推送：
                            true:移动端不需要推送，false:移动端需要推送
     */
    public function setDonnop($data){

    }

    /*
     * 好友关系 添加好友
     * 参数	类型	必须	说明
        accid	String	是	加好友发起者accid
        faccid	String	是	加好友接收者accid
        type	int	    是	1直接加好友，2请求加好友，3同意加好友，4拒绝加好友
         msg	String	否	加好友对应的请求消息，第三方组装，最长256字符
     */
    public function friendAdd(array $data = null){
        if($data === null){
            return null;
        }
        else{
            if(isset($data['accid'])
                && isset($data['faccid'])
                && isset($data['type'])){
                $dataArray = array();
                $dataArray['accid'] = (string)$data['accid'];
                $dataArray['faccid'] = (string)$data['faccid'];
                $dataArray['type'] = (int)$data['type'];

                if(isset($data['msg'])){
                    $dataArray['msg'] = (string)$data['msg'];
                }

                $url = $this->urls['friend']['add'];

                $curl = new IMCurl($url,$dataArray);

                return $curl->getResponse();
            }
            else{
                return false;
            }
        }
    }

    /*
     * 更新好友相关信息
     * 更新好友相关信息，如加备注名，必须是好友才可以
     *
        参数	类型	必须	说明
        accid	String	是	发起者accid
        faccid	String	是	要修改朋友的accid
        alias	String	否	给好友增加备注名，限制长度128
            ex	String	否	修改ex字段，限制长度256

     */
    public function friendUpdate(array $data = null){
        if($data === null){
            return null;
        }
        else{
            if(isset($data['accid']) && isset($data['faccid'])){
                $dataArray = array();
                $dataArray['accid'] = (string)$data['accid'];
                $dataArray['faccid'] = (string)$data['faccid'];

                if(isset($data['alias'])){
                    $dataArray['alias'] = (string)$data['alias'];
                }

                if(isset($data['ex'])){
                    $dataArray['ex'] = (string)$data['ex'];
                }

                $url = $this->urls['friend']['update'];
                $curl = new IMCurl($url,$dataArray);
                return $curl->getResponse();
            }
        }
    }

    /*
     * 删除好友
     * 参数	类型	必须	说明
        accid	String	是	发起者accid
        faccid	String	是	要删除朋友的accid

     */
    public function friendDelete(array $data = null){
        if($data === null){
            return null;
        }
        else{
            if(isset($data['accid']) && isset($data['faccid'])){
                $data['accid'] = (string)$data['accid'];
                $data['faccid'] = (string)$data['faccid'];

                $url = $this->urls['friend']['delete'];
                $curl = new IMCurl($url,$data);
                return $curl->getResponse();
            }
        }
    }

    /*
     * 获取好友关系
     * 查询某时间点起到现在有更新的双向好友
     * 参数	类型	必须	说明
        accid	String	是	发起者accid
     createtime	String	是	查询的时间点
     */
    public function friendGet($data){

    }

    /*
     * 设置黑名单/静音
     * 拉黑/取消拉黑；设置静音/取消静音
     * 参数	类型	必须	说明
        accid	String	是	用户帐号，最大长度32字符，必须保证一个
                            APP内唯一
    targetAcc	String	是	被加黑或加静音的帐号
   relationType	int	    是	本次操作的关系类型,1:黑名单操作，2:静音列表操作
        value	int	    是	操作值，0:取消黑名单或静音，1:加入黑名单或静音

     */
    public function setSpecialRelation($data){

    }

    /*
     * 查看指定用户的黑名单和静音列表
     * 参数	类型	必须	说明
        accid	String	是	用户帐号，最大长度32字符，必须保证一个
                            APP内唯一
     */
    public function listBlackAndMuteList($data){

    }

    /*
     * 群组功能（高级群）
     * 注意：所有群操作一个ip一分钟操作次数超过600次，会返回416错误码。
     * 创建群
     * 创建高级群，以邀请的方式发送给用户；
        custom 字段是给第三方的扩展字段，第三方可以基于此字段扩展高级群的功能，构建自己需要的群；
        建群成功会返回tid，需要保存，以便于加人与踢人等后续操作；
        每个用户可创建的群数量有限制，限制值由 IM 套餐的群组配置决定，可登录管理后台查看。
        参数	类型	必须	说明
        tname	String	是	群名称，最大长度64字符
        owner	String	是	群主用户帐号，最大长度32字符
        members	String	是	["aaa","bbb"](JSONArray对应的accid，如果解析出错会报414)，一次最多拉200个成员
   announcement	String	否	群公告，最大长度1024字符
        intro	String	否	群描述，最大长度512字符
          msg	String	是	邀请发送的文字，最大长度150字符
        magree	int	    是	管理后台建群时，0不需要被邀请人同意加入群，1需要被邀请人同意才可以加入群。其它会返回414
       joinmode	int	    是	群建好后，sdk操作时，0不用验证，1需要验证,2不允许任何人加入。其它返回414
        custom	String	否	自定义高级群扩展属性，第三方可以跟据此属性自定义扩展自己的群属性。（建议为json）,最大长度1024字符
        icon	String	否	群头像，最大长度1024字符
   beinvitemode	int	    否	被邀请人同意方式，0-需要同意(默认),1-不需要同意。其它返回414
    invitemode	int	    否	谁可以邀请他人入群，0-管理员(默认),1-所有人。其它返回414
    uptinfomode	int	    否	谁可以修改群资料，0-管理员(默认),1-所有人。其它返回414
   upcustommode	int	    否	谁可以更新群自定义属性，0-管理员(默认),1-所有人。其它返回414
     */
    public function teamCreate($data){

    }

    /*
     * 拉人入群
     *  1.可以批量邀请，邀请时需指定群主；
        2.当群成员达到上限时，再邀请某人入群返回失败；
        3.当群成员达到上限时，被邀请人“接受邀请"的操作也将返回失败。
        参数	类型	必须	说明
          tid	String	是	网易云通信服务器产生，群唯一标识，创建群时会返回，最大长度128字符
        owner	String	是	群主用户帐号，最大长度32字符
        members	String	是	["aaa","bbb"](JSONArray对应的accid，如果解析出错会报414)，一次最多拉200个成员
        magree	int	    是	管理后台建群时，0不需要被邀请人同意加入群，1需要被邀请人同意才可以加入群。其它会返回414
        msg	    String	是	邀请发送的文字，最大长度150字符
        attach	String	否	自定义扩展字段，最大长度512
     */
    public function teamAdd($data){

    }

    /*
     * 踢人出群
     * 高级群踢人出群，需要提供群主accid以及要踢除人的accid。
     * 参数	类型	必须	说明
        tid	String	是	网易云通信服务器产生，群唯一标识，创建群时会返回，最大长度128字符
      owner	String	是	群主的accid，用户帐号，最大长度32字符
    member	String	是	被移除人的accid，用户账号，最大长度字符
    attach	String	否	自定义扩展字段，最大长度512
     */
    public function teamKick($data){

    }

    /*
     * 解散群
     * 删除整个群，会解散该群，需要提供群主accid，谨慎操作！
     *
                参数	类型	必须	说明
          tid	String	是	网易云通信服务器产生，群唯一标识，创建群时会返回，最大长度128字符
        owner	String	是	群主用户帐号，最大长度32字符
     */
    public function teamRemove($data){

    }

    /*
     * 编辑群资料
     * 高级群基本信息修改
     * 参数	类型	必须	说明
          tid	String	是	网易云通信服务器产生，群唯一标识，创建群时会返回
        tname	String	否	群名称，最大长度64字符
        owner	String	是	群主用户帐号，最大长度32字符
 announcement	String	否	群公告，最大长度1024字符
        intro	String	否	群描述，最大长度512字符
    joinmode	int	    否	群建好后，sdk操作时，0不用验证，1需要验证,2不允许任何人加入。其它返回414
        custom	String	否	自定义高级群扩展属性，第三方可以跟据此属性自定义扩展自己的群属性。（建议为json）,最大长度1024字符
        icon	String	否	群头像，最大长度1024字符
   beinvitemode	int	    否	被邀请人同意方式，0-需要同意(默认),1-不需要同意。其它返回414
    invitemode	int	    否	谁可以邀请他人入群，0-管理员(默认),1-所有人。其它返回414
    uptinfomode	int	    否	谁可以修改群资料，0-管理员(默认),1-所有人。其它返回414
   upcustommode	int	    否	谁可以更新群自定义属性，0-管理员(默认),1-所有人。其它返回414
     */
    public function teamUpdate($data){

    }

    /*
     * 群信息与成员列表查询
     * 高级群信息与成员列表查询，一次最多查询30个群相关的信息，跟据ope参数来控制是否带上群成员列表；
        查询群成员会稍微慢一些，所以如果不需要群成员列表可以只查群信息；
        此接口受频率控制，某个应用一分钟最多查询30次，超过会返回416，并且被屏蔽一段时间；
        群成员的群列表信息中增加管理员成员admins的返回。
    参数	类型	必须	说明
        tids	String	是	群id列表，如["3083","3084"]
        ope	    int	    是	1表示带上群成员列表，0表示不带群成员列表，只返回群信息

     */
    public function teamQuery($data){

    }

    /*
     * 移交群主
     * 转换群主身份；
        群主可以选择离开此群，还是留下来成为普通成员。
    参数	类型	必须	说明
      tid	String	是	网易云通信服务器产生，群唯一标识，创建群时会返回，最大长度128字符
    owner	String	是	群主用户帐号，最大长度32字符
newowner	String	是	新群主帐号，最大长度32字符
    leave	int	    是	1:群主解除群主后离开群，2：群主解除群主后成为普通成员。其它414
     */
    public function teamChangeOwner($data){

    }

    /*
     * 任命管理员
     * 提升普通成员为群管理员，可以批量，但是一次添加最多不超过10个人。
     * 参数	类型	必须	说明
      tid	String	是	网易云通信服务器产生，群唯一标识，创建群时会返回，最大长度128字符
    owner	String	是	群主用户帐号，最大长度32字符
    members	String	是	["aaa","bbb"](JSONArray对应的accid，如果解析出错会报414)，长度最大1024字符（一次添加最多10个管理员）
     */
    public function teamAddManager(array $data = null){

    }

    /*
     * 移除管理员
     * 解除管理员身份，可以批量，但是一次解除最多不超过10个人
     * 参数	类型	必须	说明
         tid	String	是	网易云通信服务器产生，群唯一标识，创建群时会返回，最大长度128字符
        owner	String	是	群主用户帐号，最大长度32字符
       members	String	是	["aaa","bbb"](JSONArray对应的accid，如果解析出错会报414)，长度最大1024字符（一次解除最多10个管理员）
     */
    public function teamRemoveManager(array $data = null){

    }

    /*
     * 获取某用户所加入的群信息
     * 获取某个用户所加入高级群的群信息
     * 参数	类型	必须	说明
        accid	String	是	要查询用户的accid

     */
    public function joinTeams(array $data = null){

    }

    /*
     * 修改群昵称
     * 修改指定账号在群内的昵称
     * 参数	类型	必须	说明
     tid	String	是	群唯一标识，创建群时网易云通信服务器产生并返回
    owner	String	是	群主 accid
    accid	String	是	要修改群昵称的群成员 accid
    nick	String	是	accid 对应的群昵称，最大长度32字符
     */
    public function updateTeamNick(array $data = null){

    }

    /*
     * 修改消息提醒开关
     * 高级群修改消息提醒开关
     * 参数	类型	必须	说明
      tid	String	是	网易云通信服务器产生，群唯一标识，创建群时会返回
    accid	String	是	要操作的群成员accid
      ope	int	    是	1：关闭消息提醒，2：打开消息提醒，其他值无效
     */
    public function muteTeam(array $data = null){

    }

    /*
     * 禁言群成员
     * 高级群禁言群成员
     * 参数	类型	必须	说明
     tid	String	是	网易云通信服务器产生，群唯一标识，创建群时会返回
    owner	String	是	群主accid
    accid	String	是	禁言对象的accid
    mute	int	    是	1-禁言，0-解禁
     */
    public function muteTlist(array $data = null){

    }

    /*
     * 主动退群
     * 高级群主动退群
     * 参数	类型	必须	说明
            tid	String	是	网易云通信服务器产生，群唯一标识，创建群时会返回
        accid	String	是	退群的accid
     */
    public function teamLeave(array $data = null){

    }

    /*
     * 将群组整体禁言
     * 禁言群组，普通成员不能发送消息，创建者和管理员可以发送消息
     *
        参数	类型	必须	说明
         tid	String	是	网易云通信服务器产生，群唯一标识，创建群时会返回
        owner	String	是	群主的accid
        mute	String	是	true:禁言，false:解禁
     */
    public function muteTlistAll(array $data = null){

    }

    /*
     * 获取群组禁言列表
     * 获取群组禁言的成员列表
     * 参数	类型	必须	说明
          tid	String	是	网易云通信服务器产生，群唯一标识，创建群时会返回
        owner	String	是	群主的accid
     */
    public function listTeamMute(array $data = null){

    }

    /*
     * 云端记录
     * 查询存储在网易云通信服务器中的单人聊天历史消息，只能查询在保存时间范围内的消息

跟据时间段查询点对点消息，每次最多返回100条；
不提供分页支持，第三方需要跟据时间段来查询。
    参数	类型	必须	说明
from	String	是	发送者accid
to	String	是	接收者accid
begintime	String	是	开始时间，ms
endtime	String	是	截止时间，ms
limit	int	是	本次查询的消息条数上限(最多100条),小于等于0，或者大于100，会提示参数错误
reverse	int	否	1按时间正序排列，2按时间降序排列。其它返回参数414错误.默认是按降序排列
     */
    public function querySessionMsg(array $data = null){

    }

    /*
     * 群聊云端历史消息查询
     * 查询存储在网易云通信服务器中的群聊天历史消息，只能查询在保存时间范围内的消息

跟据时间段查询群消息，每次最多返回100条；
不提供分页支持，第三方需要跟据时间段来查询。
    参数	类型	必须	说明
tid	String	是	群id
accid	String	是	查询用户对应的accid.
begintime	String	是	开始时间，ms
endtime	String	是	截止时间，ms
limit	int	是	本次查询的消息条数上限(最多100条),小于等于0，或者大于100，会提示参数错误
reverse	int	否	1按时间正序排列，2按时间降序排列。其它返回参数414错误。默认是按降序排列

     */
    public function queryTeamMsg(array $data = null){

    }

    /*
     * 历史消息查询返回的消息格式说明
1.普通文本消息

复制{
    "from":”test1”,
    "msgid":792478,
    "sendtime":1430967883307,
    "type":0,//文本消息类型
    "body":{
        "msg":"哈哈哈"//消息内容
     }
}
2.图片消息

复制{
    "from":”test1”,
    "msgid":792502,
    "sendtime":1430978396680,   //发送时间ms
    "type":1    //图片类型消息
    "body":{
        "name":"图片发送于2015-05-07 13:59",         //图片name
        "md5":"9894907e4ad9de4678091277509361f7",   //md5
        "url":"http://nimtest.nos.netease.com/cbc500e8-e19c-4b0f-834b-c32d4dc1075e",    //生成的url
        "ext":"jpg",        //图片后缀
        "w":6814,       //宽
        "h":2332,       //高
        "size":388245       //图片大小
    }
}
3.语音消息

复制{
    "from":”test1”,
    "msgid":792479,
    "sendtime":1430967899646,   //发送时间ms
    "type":2    //语音类型消息
    "body":{
        "dur":4551,     //语音持续时长ms
        "md5":"87b94a090dec5c58f242b7132a530a01",   //md5
        "url":"http://nimtest.nos.netease.com/a2583322-413d-4653-9a70-9cabdfc7f5f9",    //生成的url
        "ext":"aac",        //语音消息格式，只能是aac格式
        "size":16420        //语音文件大小
    }
}
4.视频消息

复制{
    "from":”test1”,
    "msgid":792505,
    "sendtime":1430978424249,   //发送时间ms
    "type":3    //视频类型消息
    "body":{
        "dur":8003,     //视频持续时长ms
        "md5":"da2cef3e5663ee9c3547ef5d127f7e3e",   //md5
        "url":"http://nimtest.nos.netease.com/21f34447-e9ac-4871-91ad-d9f03af20412",    //生成的url
        "w":360,    //宽
        "h":480,    //高
        "ext":"mp4",    //视频格式
        "size":16420    //视频文件大小
    }
}
5.地理位置消息

复制{
    "from":”test1”,
    "msgid":792501,
    "sendtime":1430978381896,   //发送时间ms
    "type":4    //地理位置类型消息
    "body":{
        "title":"中国 浙江省 杭州市 网商路 599号",  //地理位置title
        "lng":120.1908686708565,        // 经度
        "lat":30.18704515647036         // 纬度
    }
}
6.文件消息

复制{
    "msgid":7925061,
    "sendtime":1430978435894,   //发送时间ms
    "type":6    //文件消息
    "body":{
       "name":"BlizzardReg.ttf",   //文件名
       "md5":"79d62a35fa3d34c367b20c66afc2a500", //文件MD5
       "url":"http://nimtest.nos.netease.com/08c9859d-183f-4daa-9904-d6cacb51c95b", //文件URL
       "ext":"ttf",    //文件后缀类型
       "size":91680    //大小
    }
}
7.第三方自定义消息

复制{
    "msgid":792506,
    "sendtime":1430978435894,   //发送时间ms
    "type":100, //第三方自定义消息
    "body":{     //自定义的内容，需要符合json格式
        …
    }
}
8.群内系统通知

复制{
    "msgid ":278703112201,
    "from":"t4",                //通知发起者
    "sendtime":1430978435894,   //发送时间ms
    "type":5    //群notifycation通知
    "body":{
       "tid":4153,     //群id
       "tname":"key1", //群名称 （某些操作会有）
       "ope":1,            //notify通知类型 （0:群拉人，1:群踢人，2:退出群，3:群信息更新，4:群解散，5:申请加入群成功，6:退出并移交群主，7:增加管理员，8:删除管理员，9:接受邀请进群）
       "accids":["t2"],    //被操作的对象 （群成员操作时才有）
       "intro":"群介绍",  //（ope=3时群信息修改项）
       "announcement":"群公告", （ope=3时群信息修改项）
       "joinmode":1,       //加入群的模式0不需要认证，1需要认证 ,（ope=3时群信息修改项）
       "config":"第三方服务器配制修改项",（ope=3时群信息修改项）
       "updatetime":1432804852021 //通知后台更新时间 （群操作时有）
    }
}
     */

    /*
     * 用户登录登出事件记录查询
     * 1.跟据时间段查询用户的登录登出记录，每次最多返回100条。
2.不提供分页支持，第三方需要跟据时间段来查询。
    参数	类型	必须	说明
accid	String	是	要查询用户的accid
begintime	String	是	开始时间，ms
endtime	String	是	截止时间，ms
limit	int	是	本次查询的消息条数上限(最多100条),小于等于0，或者大于100，会提示参数错误
reverse	int	否	1按时间正序排列，2按时间降序排列。其它返回参数414错误。默认是按降序排列

     */
    public function queryUserEvents(array $data = null){

    }

    /*
     * 删除音视频/白板服务器录制文件
     * 1.此接口有频控限制，每分钟可调用不超过300次
     * 参数	类型	必须	说明
        channelid	long	是	需要删除的文件的通道号

     */
    public function deleteMediaFile(array $data = null){

    }

    /*
     * 订阅在线状态事件
     * 订阅指定人员的在线状态事件，每个账号最大有效订阅账号不超过3000个
     * 参数	类型	必须	说明
accid	String	是	事件订阅人账号
eventType	int	是	事件类型，固定设置为1，即 eventType=1
publisherAccids	String	是	被订阅人的账号列表，最多100个账号，JSONArray格式。示例：["pub_user1","pub_user2"]
ttl	long	是	有效期，单位：秒。取值范围：60～2592000（即60秒到30天）
     */
    public function subscribeAdd(array $data = null){

    }

    /*
     * 取消在线状态事件订阅
     * 取消订阅指定人员的在线状态事件
     * 参数	类型	必须	说明
accid	String	是	事件订阅人账号
eventType	int	是	事件类型，固定设置为1，即 eventType=1
publisherAccids	String	是	取消被订阅人的账号列表，最多100个账号，JSONArray格式。示例：["pub_user1","pub_user2"]
     */
    public function subscribeDelete(array $data = null){

    }

    /*
     * 取消全部在线状态事件订阅
     * 取消指定事件的全部订阅关系
     *  参数	类型	必须	说明
accid	String	是	事件订阅人账号
eventType	int	是	事件类型，固定设置为1，即 eventType=1

     */
    public function subscribeBatchdel(array $data = null){

    }

    /*
     * 查询在线状态事件订阅关系
     * 查询指定人员的有效在线状态事件订阅关系
     * 参数	类型	必须	说明
accid	String	是	事件订阅人账号
eventType	int	是	事件类型，固定设置为1，即 eventType=1
publisherAccids	String	是	被订阅人的账号列表，最多100个账号，JSONArray格式。示例：["pub_user1","pub_user2"]
     */
    public function subscribeQuery(array $data = null){

    }
}